import numpy as np
import numpy.matlib as matlib

def demonstrate_numpy_matrix_library():
    """
    演示NumPy矩阵库(Matrix)的功能
    基于菜鸟教程的完整知识点实现
    """
    
    print("=" * 60)
    print("NumPy 矩阵库(Matrix)演示")
    print("=" * 60)
    
    # 1. 矩阵转置演示
    print("\n1. 矩阵转置")
    print("-" * 40)
    
    # 创建数组并转置
    a = np.arange(12).reshape(3, 4)
    print("原数组:")
    print(a)
    print("\n转置数组 (使用T属性):")
    print(a.T)
    print("\n转置数组 (使用transpose函数):")
    print(np.transpose(a))
    
    # 2. matlib.empty() - 创建未初始化矩阵
    print("\n2. matlib.empty() - 创建未初始化矩阵")
    print("-" * 40)
    
    empty_matrix = matlib.empty((2, 2))
    print("2x2 未初始化矩阵:")
    print(empty_matrix)
    print("数据类型:", empty_matrix.dtype)
    
    # 3. matlib.zeros() - 创建全零矩阵
    print("\n3. matlib.zeros() - 创建全零矩阵")
    print("-" * 40)
    
    zeros_matrix = matlib.zeros((3, 3))
    print("3x3 全零矩阵:")
    print(zeros_matrix)
    
    # 指定数据类型
    zeros_int = matlib.zeros((2, 2), dtype=int)
    print("\n2x2 整数全零矩阵:")
    print(zeros_int)
    
    # 4. matlib.ones() - 创建全一矩阵
    print("\n4. matlib.ones() - 创建全一矩阵")
    print("-" * 40)
    
    ones_matrix = matlib.ones((3, 3))
    print("3x3 全一矩阵:")
    print(ones_matrix)
    
    # 5. matlib.eye() - 创建对角线矩阵
    print("\n5. matlib.eye() - 创建对角线矩阵")
    print("-" * 40)
    
    # 标准单位矩阵
    eye_matrix = matlib.eye(n=3, M=4, k=0, dtype=float)
    print("3x4 对角线矩阵 (k=0):")
    print(eye_matrix)
    
    # 偏移对角线
    eye_k1 = matlib.eye(n=4, M=4, k=1, dtype=float)
    print("\n4x4 对角线矩阵 (k=1 - 上对角线):")
    print(eye_k1)
    
    eye_k_minus1 = matlib.eye(n=4, M=4, k=-1, dtype=float)
    print("\n4x4 对角线矩阵 (k=-1 - 下对角线):")
    print(eye_k_minus1)
    
    # 6. matlib.identity() - 创建单位矩阵
    print("\n6. matlib.identity() - 创建单位矩阵")
    print("-" * 40)
    
    identity_matrix = matlib.identity(5, dtype=float)
    print("5x5 单位矩阵:")
    print(identity_matrix)
    
    # 7. matlib.rand() - 创建随机矩阵
    print("\n7. matlib.rand() - 创建随机矩阵")
    print("-" * 40)
    
    rand_matrix = matlib.rand(3, 3)
    print("3x3 随机矩阵 (0-1均匀分布):")
    print(rand_matrix)
    
    # 8. 矩阵与ndarray的互换
    print("\n8. 矩阵与ndarray的互换")
    print("-" * 40)
    
    # 从字符串创建矩阵
    matrix_from_str = np.matrix('1,2;3,4')
    print("从字符串创建矩阵:")
    print(matrix_from_str)
    print("类型:", type(matrix_from_str))
    
    # 矩阵转换为数组
    array_from_matrix = np.asarray(matrix_from_str)
    print("\n矩阵转换为数组:")
    print(array_from_matrix)
    print("类型:", type(array_from_matrix))
    
    # 数组转换为矩阵
    matrix_from_array = np.asmatrix(array_from_matrix)
    print("\n数组转换为矩阵:")
    print(matrix_from_array)
    print("类型:", type(matrix_from_array))
    
    # 9. 其他矩阵创建函数
    print("\n9. 其他矩阵创建函数")
    print("-" * 40)
    
    # 使用matrix函数创建
    matrix_obj = np.matrix([[1, 2], [3, 4]])
    print("使用np.matrix创建:")
    print(matrix_obj)
    
    # bmat函数 - 从块创建矩阵
    A = np.matrix('1,2;3,4')
    B = np.matrix('5,6;7,8')
    block_matrix = np.bmat([[A, B], [B, A]])
    print("\n使用bmat创建块矩阵:")
    print(block_matrix)
    
    # repmat函数 - 重复矩阵
    small_matrix = np.matrix('1,2;3,4')
    repeated_matrix = matlib.repmat(small_matrix, 2, 3)
    print("\n使用repmat重复矩阵 (2行3列):")
    print(repeated_matrix)
    
    # 10. 矩阵运算演示
    print("\n10. 矩阵运算演示")
    print("-" * 40)
    
    # 创建测试矩阵
    M1 = np.matrix('1,2,3;4,5,6')
    M2 = np.matrix('7,8;9,10;11,12')
    
    print("矩阵 M1 (2x3):")
    print(M1)
    print("\n矩阵 M2 (3x2):")
    print(M2)
    
    # 矩阵乘法
    result_multiply = M1 * M2
    print("\n矩阵乘法 M1 * M2:")
    print(result_multiply)
    
    # 使用@运算符 (推荐)
    result_at = M1 @ M2
    print("\n使用@运算符 M1 @ M2:")
    print(result_at)
    
    # 矩阵转置
    print("\nM1 的转置:")
    print(M1.T)
    
    # 11. 与ndarray的对比
    print("\n11. 矩阵(Matrix)与数组(ndarray)对比")
    print("-" * 40)
    
    # 创建相同内容的矩阵和数组
    matrix_2x2 = np.matrix('1,2;3,4')
    array_2x2 = np.array([[1, 2], [3, 4]])
    
    print("矩阵:")
    print(matrix_2x2)
    print("类型:", type(matrix_2x2))
    print("形状:", matrix_2x2.shape)
    print("维度:", matrix_2x2.ndim)
    
    print("\n数组:")
    print(array_2x2)
    print("类型:", type(array_2x2))
    print("形状:", array_2x2.shape)
    print("维度:", array_2x2.ndim)
    
    # 乘法操作对比
    print("\n乘法操作对比:")
    print("矩阵乘法 (M * M):", matrix_2x2 * matrix_2x2)
    print("数组逐元素乘法 (A * A):", array_2x2 * array_2x2)
    print("数组矩阵乘法 (A @ A):", array_2x2 @ array_2x2)

def advanced_matrix_operations():
    """
    高级矩阵操作演示
    """
    print("\n" + "=" * 60)
    print("高级矩阵操作")
    print("=" * 60)
    
    # 1. 线性代数运算
    print("\n1. 线性代数运算")
    print("-" * 40)
    
    # 创建方阵
    A = np.matrix('3,1,4;1,5,9;2,6,5')
    print("矩阵 A:")
    print(A)
    
    # 行列式
    det_A = np.linalg.det(A)
    print(f"\n行列式 det(A): {det_A:.2f}")
    
    # 逆矩阵
    try:
        inv_A = np.linalg.inv(A)
        print("逆矩阵 inv(A):")
        print(inv_A)
        
        # 验证 A * A⁻¹ = I
        identity_check = A * inv_A
        print("\n验证 A * inv(A) 是否接近单位矩阵:")
        print(identity_check)
    except np.linalg.LinAlgError:
        print("矩阵不可逆")
    
    # 特征值和特征向量
    eigenvalues, eigenvectors = np.linalg.eig(A)
    print(f"\n特征值: {eigenvalues}")
    print("特征向量:")
    print(eigenvectors)
    
    # 2. 解线性方程组
    print("\n2. 解线性方程组")
    print("-" * 40)
    
    # 方程组: 2x + y = 5, x + 3y = 10
    coefficients = np.matrix('2,1;1,3')
    constants = np.matrix('5;10')
    
    solution = np.linalg.solve(coefficients, constants)
    print("方程组:")
    print("2x + y = 5")
    print("x + 3y = 10")
    print("解:")
    print(solution)
    
    # 3. 随机矩阵分布
    print("\n3. 不同分布的随机矩阵")
    print("-" * 40)
    
    # 均匀分布
    uniform_rand = matlib.rand(3, 3)
    print("均匀分布随机矩阵:")
    print(uniform_rand)
    
    # 正态分布
    normal_rand = matlib.randn(3, 3)
    print("\n标准正态分布随机矩阵:")
    print(normal_rand)

def modern_ndarray_approach():
    """
    现代ndarray方法演示（推荐方式）
    """
    print("\n" + "=" * 60)
    print("现代ndarray方法（推荐）")
    print("=" * 60)
    
    print("""
NumPy官方推荐使用ndarray和@运算符进行矩阵运算，原因如下：
1. 更好的兼容性和灵活性
2. 支持多维数组操作
3. 更清晰的语法
4. 未来版本中matrix可能被弃用
    """)
    
    # 使用ndarray进行矩阵运算
    A = np.array([[1, 2], [3, 4]])
    B = np.array([[5, 6], [7, 8]])
    
    print("使用ndarray进行矩阵运算:")
    print("数组 A:")
    print(A)
    print("数组 B:")
    print(B)
    
    # 矩阵乘法
    print("\n矩阵乘法 A @ B:")
    print(A @ B)
    
    # 转置
    print("\n转置 A.T:")
    print(A.T)
    
    # 逐元素运算
    print("\n逐元素乘法 A * B:")
    print(A * B)

if __name__ == "__main__":
    # 执行主要演示
    demonstrate_numpy_matrix_library()
    
    # 高级矩阵操作
    advanced_matrix_operations()
    
    # 现代ndarray方法
    modern_ndarray_approach()
    
    # 总结说明
    print("\n" + "=" * 70)
    print("知识点总结:")
    print("=" * 70)
    print("""
NumPy矩阵库核心知识点总结：

1. 矩阵创建函数:
   - matlib.empty(): 创建未初始化矩阵
   - matlib.zeros(): 创建全零矩阵
   - matlib.ones(): 创建全一矩阵
   - matlib.eye(): 创建对角线矩阵
   - matlib.identity(): 创建单位矩阵
   - matlib.rand(): 创建随机矩阵

2. 矩阵与数组转换:
   - np.matrix(): 从数据创建矩阵
   - np.asmatrix(): 将输入转换为矩阵
   - np.asarray(): 将矩阵转换为数组

3. 矩阵特性:
   - 矩阵总是二维的
   - 支持标准的矩阵运算(*表示矩阵乘法)
   - 使用T属性或transpose()进行转置

4. 重要区别:
   - 矩阵乘法: M1 * M2 (矩阵乘法)
   - 数组乘法: A1 * A2 (逐元素乘法)
   - 数组矩阵乘法: A1 @ A2 (使用@运算符)

5. 现代推荐:
   - 优先使用ndarray和@运算符
   - 更灵活且未来兼容性更好
   - 支持多维数组操作

6. 实用函数:
   - np.bmat(): 从块构建矩阵
   - matlib.repmat(): 重复矩阵
   - matlib.randn(): 正态分布随机矩阵

注意: 虽然matrix类型在某些场景下更方便，但NumPy官方推荐使用ndarray来保证更好的兼容性。
    """)